﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TireService.Data
{
    public partial class Car
    {
        TireServiceDB db = new TireServiceDB();

        /// <summary>
        /// Validation rules to ensure data is filled out in mandatory fields
        /// </summary>
        partial void OnValidate(System.Data.Linq.ChangeAction action)
        {
            if (this.CustomerId == null)
            {
                throw new ArgumentException("Kunde skal angives for bil.");
            }

            if (this.RegistrationNumber == null)
            {
                throw new ArgumentException("Registreringsnummer skal udfyldes.");
            }

            if (this.CarBrandId == null)
            {
                throw new ArgumentException("Bilmærke skal udfyldes.");
            }

            if (this.Model == null | this.Model == string.Empty)
            {
                throw new ArgumentException("Model skal udfyldes.");
            }

            if (this.Year == null)
            {
                throw new ArgumentException("Årgang skal udfyldes.");
            }

            if (this.Color == null | this.Color == string.Empty)
            {
                throw new ArgumentException("Farve skal udfyldes.");
            }

            if (this.CarStatusId == null)
            {
                throw new ArgumentException("Status på bil skal angives.");
            }
        }

        partial void OnCarStatusIdChanging(int value)
        {
            // ERROR: Udkommenteret d. 13/10-2012, måske bruges senere
            //// Check if any open tasks on car
            //int[] tasktypestatus = new int[] { (int)Shared.TaskTypeStatus.ServiceDrive_Created, (int)Shared.TaskTypeStatus.ServiceDrive_Planned, (int)Shared.TaskTypeStatus.ServiceDrive_Replan };
            //List<Task> opentasks = db.GetTasksByCarAndTaskTypeStatus(this.CarId, tasktypestatus);
            //if (opentasks.Count != 0)
            //{
            //    // Check that taskstatus and new carstatus id does not conflict with any open tasks
            //    foreach (Task opentask in opentasks)
            //    {
            //        // Check for each taskdetail if any conflicts
            //        List<TaskDetail> opentaskdetails = opentask.TaskDetails.ToList();

            //        if (opentaskdetails.Count != 0)
            //        {
            //            foreach (TaskDetail opentaskdetail in opentaskdetails)
            //            {
            //                if (value == (int)Shared.CarStatus.Active)
            //                {
            //                    // ERROR: 13/10 - tyder på at det er en fejl
            //                    //if (opentaskdetail.TaskDetailTypeId == (int)Shared.TaskDetailType.ServiceDrive_ChangeTire)
            //                    //{
            //                    //    throw new ArgumentException("Bil status kan ikke ændres til aktiv, da der ligger aktiv opgave omkring hjulskift.");
            //                    //}
            //                }
                            
            //                if (value == (int)Shared.CarStatus.NeedsTireChanged)
            //                {
            //                    // Nothing - are all good
            //                }

            //                if (value == (int)Shared.CarStatus.AwaitsTireChangePlanning)
            //                {
            //                    if (opentaskdetail.TaskDetailTypeId == (int)Shared.TaskDetailType.ServiceDrive_PickUpTire)
            //                    {
            //                        // Nothing - are all good, business logic else where should have ensured dependency creation to planned tirechange task
            //                    }

            //                    // ERROR: 27/8 - tyder på at det er en fejl
            //                    //if (opentaskdetail.TaskDetailTypeId == (int)Shared.TaskDetailType.ServiceDrive_ChangeTire)
            //                    //{
            //                    //    throw new ArgumentException("Bil status kan ikke ændres, da der ligger aktiv opgave omkring hjulskift.");
            //                    //}
            //                }

            //                if (value == (int)Shared.CarStatus.PlannedTireChange)
            //                {
            //                    if (opentaskdetail.TaskDetailTypeId == (int)Shared.TaskDetailType.ServiceDrive_PickUpTire)
            //                    {
            //                        // Nothing - are all good, business logic else where should have ensured dependency creation to planned tirechange task
            //                    }

            //                    // ERROR: 27/8 - tyder på at det er en fejl
            //                    //if (opentaskdetail.TaskDetailTypeId == (int)Shared.TaskDetailType.ServiceDrive_ChangeTire)
            //                    //{
            //                    //    throw new ArgumentException("Bil status kan ikke ændres, da der ligger aktiv opgave omkring hjulskift.");
            //                    //}
            //                }

            //                if (value == (int)Shared.CarStatus.TireChanged)
            //                {
            //                    // ERROR: 27/8 - vil potentielt ikke virke, da status skift sker samtidigt, ex. ved færdigmelding - vil derfor give fejl
            //                    if (opentaskdetail.TaskDetailTypeId == (int)Shared.TaskDetailType.ServiceDrive_ChangeTire)
            //                    {
            //                        throw new ArgumentException("Bil status kan ikke ændres, da der ligger aktiv opgave omkring hjulskift.");
            //                    }
            //                }

            //                if (value == (int)Shared.CarStatus.InActive)
            //                {
            //                    if (opentaskdetail.TaskDetailTypeId == (int)Shared.TaskDetailType.ServiceDrive_PickUpTire)
            //                    {
            //                        throw new ArgumentException("Bil kan ikke deaktiveres, da der ligger aktiv opgave omkring hjul afhentning på bil.");
            //                    }

            //                    if (opentaskdetail.TaskDetailTypeId == (int)Shared.TaskDetailType.ServiceDrive_ChangeTire)
            //                    {
            //                        throw new ArgumentException("Bil kan ikke deaktiveres, da der ligger aktiv opgave omkring hjulskift.");
            //                    }
            //                }
            //            }
                        
            //        }
            //    }
            //}
        }

        ///// <summary>
        ///// Validation rule making sure that subscription can be assigned to the car
        ///// </summary>
        ///// <param name="value">New value for SubscriptionId</param>
        //partial void OnSubscriptionIdChanging(int? value)
        //{
        //    if (value != null)
        //    {
        //        // Validate that car can be added to subscription

        //        // Check subscription is in customers list
        //        if (db.GetCustomerSubscription(this.CustomerId, Convert.ToInt32(value)) == null)
        //        {
        //            throw new ArgumentException("Kunden har ikke tegnet dette abonnement. Tilknytning til bil kan derfor ikke gennemføres.");
        //        }

        //        // Check if subscription is for cars
        //        if (!db.ValidateSubscriptionAllowsCars(Convert.ToInt32(value)))
        //        {
        //            throw new ArgumentException("Biler kan ikke tilknyttes til denne type af abonnement.");
        //        }

        //        // Check number of cars added to subscription is not exceeded
        //        if (db.CountCarsWithSubscription(Convert.ToInt32(value), this.CustomerId) >= db.GetSubscriptionCarCount(Convert.ToInt32(value)))
        //        {
        //            throw new ArgumentException("Der kan ikke tilsluttes flere biler til det valgte abonnement.");
        //        }
        //    }
        //}
    }
}
